package com.example.pro3_webflux.controllers;

import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import reactor.core.publisher.Flux;

import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;

//WebFlux还支持服务器推送(SSE - >Server Send Event)，
@RestController
public class Test2Controller {

    /**
     * Flux : 返回0-n个元素 , 效果就是每秒会给浏览器推送数据
     * 注：需要指定MediaType
     * produces: 表示指定的响应的媒体类型 TEXT_EVENT_STREAM_VALUE表示 MIME 类型（ text/event-stream）
     * SSE 是一种基于 HTTP 长连接 的单向消息推送机制，服务器可以不断地往客户端推送数据，客户端（通常是浏览器）通过 EventSource API 来接收
     *
     *
     * SSE (text/event-stream)：单向通道，服务器推送数据，客户端只能接收，基于 HTTP/1.1
     * WebSocket：双向通信，建立独立的连接（ws:// 或 wss://），适合即时聊天、协作应用
     *
     * @return
     */
    @GetMapping(value = "/3", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
    private Flux<String> flux() {
        Flux<String> result = Flux
                .fromStream(   IntStream.range(1, 5).mapToObj(i -> {
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    return "flux data--" + i;
                }));
        return result;
    }


}
